package com.trace.app.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * 获取阿里云信息的工具类
 * 该类的执行流程：
 * 类加载后，先加载四个变量，再分别赋值
 * 接着执行重写的方法
 */
@Component
@Data
@Slf4j
public class OSSUtils implements InitializingBean {   //当项目一启动，就会执行该接口的重写方法
    @Value("${oss.endpoint}")
    private String endpoint;//地域节点

    @Value("${oss.access-key}")
    private String keyId;//id

    @Value("${oss.secret-key}")
    private String keySecret;//秘钥

    @Value("${oss.bucket}")
    private String bucketName;//项目名称

    public static String END_POINT;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;

    @Override
    public void afterPropertiesSet() throws Exception {
        END_POINT = endpoint;
        ACCESS_KEY_ID = keyId;
        ACCESS_KEY_SECRET = keySecret;
        BUCKET_NAME = bucketName;
    }

    public static String uploadFileAvatar(MultipartFile file) {

        //工具类获取值：分别是：地域节点、id、秘钥、项目名称
        String endpoint = OSSUtils.END_POINT;
        String accessKeyId = OSSUtils.ACCESS_KEY_ID;
        String accessKeySecret = OSSUtils.ACCESS_KEY_SECRET;
        String bucketName = OSSUtils.BUCKET_NAME;

        try {
            // 创建OSS实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

            //获取上传文件输入流
            InputStream inputStream = file.getInputStream();
            //获取文件名称
            String fileName = file.getOriginalFilename();

            //1、在文件名称里面添加随机唯一值（因为如果上传文件名称相同的话，后面的问价会将前面的文件给覆盖了）
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");//因为生成后的值有横岗，我们就把它去除，不替换也可以，也没有错
            fileName = uuid + fileName;

            //2、把文件安装日期进行分类： 2022/10/11/1.jpg
            //获取当前日期
            String datePath = new DateTime().toString("yyyy/MM/dd");//在依赖中引入了该工具类

            //拼接
            fileName = datePath + "/" + fileName;

            //调用oss方法实现上传
            //参数一：Bucket名称  参数二：上传到oss文件路径和文件名称  比如 /aa/bb/1.jpg 或者直接使用文件名称  参数三：上传文件的流
            ossClient.putObject(bucketName, fileName, inputStream);

            //关闭OSSClient
            ossClient.shutdown();

            //把上传之后的文件路径返回
            //需要把上传到阿里云路径返回    https://edu-guli-eric.oss-cn-beijing.aliyuncs.com/1.jpg
            String url = "https://" + bucketName + "." + endpoint + "/" + fileName;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 上传文件
     *
     * @param fileName    文件名
     * @param inputStream 流
     */
    public static String uploadFileToOss(String fileName, InputStream inputStream, String folder) {
        //工具类获取值：分别是：地域节点、id、秘钥、项目名称
        String endpoint = OSSUtils.END_POINT;
        String accessKeyId = OSSUtils.ACCESS_KEY_ID;
        String accessKeySecret = OSSUtils.ACCESS_KEY_SECRET;
        String bucketName = OSSUtils.BUCKET_NAME;

        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        try {
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            String[] names = fileName.split("[.]");
            String name = uuid + "." + names[names.length - 1];
            ossClient.putObject(new PutObjectRequest(bucketName, folder + name, inputStream));
            String url = "https://" + bucketName + "." + endpoint + "/" + folder + name;
            log.info("url:{}", url);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println(e.getMessage());
        } finally {
            ossClient.shutdown();
        }
        return null;
    }
}

